package navalgo3.Modelo;
import java.awt.Image;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;


abstract public class Nave {

        protected Rumbo rumbo;
        protected Superficie superficie;
        protected Random random;
        protected  int direccion;
       
        public Nave(ArrayList<Posicion> posicionInicialNave, Rumbo rumboInicial) {
                this.rumbo = rumboInicial;
                this.random = new Random();
        }
        
        public Nave(){
        	this.random = new Random();
    		this.setRumbo(this.generarRuboAleatorio());
    		this.generarDireccion();
        }
        
        private void generarDireccion() {
    		this.direccion = this.random.nextInt(2);	
    	}

        public void mover(){
        	if (this.rumbo.numeroDeRumbo() == 1 || this.rumbo.numeroDeRumbo() == 2){
            	if (this.superficie.estaEnElBordeSuperior() || this.superficie.estaEnElBordeInferior()){
            		invertirNave();
            	}
            }
            if (this.rumbo.numeroDeRumbo() == 3 || this.rumbo.numeroDeRumbo() == 4){
            	if (this.superficie.estaEnElBordeIzquierdo() || this.superficie.estaEnElBordeDerecho()){
            		invertirNave();
            	}
            }
            if (this.rumbo.numeroDeRumbo() == 5){
            	if (this.superficie.estaEnElBordeSuperior() || this.superficie.estaEnElBordeIzquierdo()){
            		invertirNave();
            	}
            }
            if (this.rumbo.numeroDeRumbo() == 6){
            	if (this.superficie.estaEnElBordeSuperior() || this.superficie.estaEnElBordeDerecho()){
            		invertirNave();
            	}
            }
            if (this.rumbo.numeroDeRumbo() == 7){
            	if (this.superficie.estaEnElBordeInferior() || this.superficie.estaEnElBordeIzquierdo()){
            		invertirNave();
            	}
            }
            if (this.rumbo.numeroDeRumbo() == 8){
            	if (this.superficie.estaEnElBordeInferior() || this.superficie.estaEnElBordeDerecho()){
            		invertirNave();
            	}
            }
            this.superficie.moverPartes(this.rumbo);
    }
   
        public void invertirNave(){
		this.superficie.invertirPartes();
		invertirRumbo();
	}
       
        public void invertirRumbo(){
                setRumbo(this.rumbo.invertir());
        }
       
        public void recibirImpacto(Disparo unDisparo){
                this.superficie.recibeImpacto(unDisparo);
        }
       
        public void recibirImpacto (Fragmento unFragmento){
                this.superficie.recibeImpacto(unFragmento);
        }
       
        public void setRumbo(Rumbo unRumbo){
                rumbo = unRumbo;
        }
       
        public boolean estaUbicadaEn(ArrayList<Posicion> posicionDeLaNaveAlMoverse) {
                return this.superficie.coincideConOtraSuperficie(posicionDeLaNaveAlMoverse);
        }
       
        public boolean tieneDanioEn(Posicion posicionDeImpacto) {
                return this.superficie.estaDaniadaEn(posicionDeImpacto);
        }
       
        public boolean estaDestruida() {
                return this.superficie.estaDestruida();
        }

        public boolean tieneParteEn(Posicion posicion) {
                return this.superficie.existeParteEn(posicion);
        }

		public Image dameTuImagen(Posicion posicionActual) {
			return null;
		}
		
		public boolean estaVertical(){
			return this.superficie.estaVertical();
		}
		
		protected Rumbo generarRuboAleatorio() {
			Rumbo nuevoRumbo = null;
			switch(this.random.nextInt(8)){
			case 0:
				nuevoRumbo = new Norte();
				break;
			case 1:
				nuevoRumbo = new Noreste();
				break;
			case 2:
				nuevoRumbo = new Este();
				break;
			case 3:
				nuevoRumbo = new Sudeste();
				break;
			case 4:
				nuevoRumbo = new Sur();
				break;
			case 5:
				nuevoRumbo = new Sudoeste();
				break;
			case 6:
				nuevoRumbo = new Oeste();
				break;
			case 7:
				nuevoRumbo = new Noroeste();
				break;
			}
			return nuevoRumbo;
		}
		
		public Rumbo getRumbo() {
			return this.rumbo;
		}

		public Superficie getSuperficie() {
			return this.superficie;
		}

		
}

